home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sys / boot.c < prev    next >
C/C++ Source or Header  |  1990-12-19  |  6KB  |  293 lines

  1.  
  2. /*
  3.  * @(#)boot.c 1.1 86/09/27
  4.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  5.  */
  6.  
  7. #include "../h/globram.h"
  8. #include "../h/bootparam.h"
  9. #include "../h/sunromvec.h"
  10. #include "../dev/saio.h"
  11. #include "../h/eeprom.h"
  12. #include "../sun3/cpu.addrs.h"
  13. #ifdef    SIRIUS
  14. #include "../h/enable.h"
  15. #include "../h/globram.h"
  16. #include "../sun3/cpu.map.h"
  17. #include "../h/cache.h"
  18. #endif    SIRIUS
  19.  
  20. /*
  21.  * nullsys is used as the probe routine address if the device is
  22.  * not to be booted by default.
  23.  */
  24. int    nullsys();
  25.  
  26. extern struct boottab xddriver;         /* VME Xylogics disk driver */
  27. extern struct boottab xydriver;        /* Xylogics disk driver */
  28.  
  29. #ifdef DDBOOT
  30. extern struct boottab dddriver;
  31. #endif
  32.  
  33. #ifdef IPBOOT
  34. extern struct boottab ipdriver;
  35. #endif
  36.  
  37. #ifdef ECBOOT
  38. extern struct boottab ecdriver;
  39. #endif
  40.  
  41. extern struct boottab ledriver;       /* AMD Ethernet driver */
  42. extern struct boottab iedriver;        /* Intel Ethernet driver */
  43. extern struct boottab mtdriver;        /* TapeMaster tape driver */
  44.  
  45. #ifdef ARBOOT
  46. extern struct boottab ardriver;
  47. #endif
  48.  
  49. extern struct boottab sddriver;        /* SCSI disk driver */
  50. extern struct boottab stdriver;        /* SCSI tape driver */
  51. extern struct boottab xtdriver;         /* Xylogics tape driver */
  52.  
  53. #ifdef RSBOOT
  54. extern struct boottab radriver, rbdriver;
  55. #endif 
  56.  
  57. struct boottab *(boottab[]) = {
  58. #ifndef M25
  59.         &xddriver, 
  60.     &xydriver,
  61. #endif 
  62. #ifdef DDBOOT
  63.     &dddriver,
  64. #endif
  65. #ifdef IPBOOT
  66.     &ipdriver,
  67. #endif
  68.     &sddriver,
  69. #ifdef M25
  70.     &ledriver,
  71. #else M25
  72.     &iedriver,
  73. #endif 
  74. #ifdef ECBOOT
  75.     &ecdriver,
  76. #endif
  77. #ifndef M25
  78.     &mtdriver,
  79.     &xtdriver,
  80. #endif M25
  81.     &stdriver,
  82. #ifdef ARBOOT
  83.     &ardriver,
  84. #endif
  85. #ifdef RSBOOT
  86.     &radriver,
  87.     &rbdriver,
  88. #endif
  89.     0,
  90. };
  91.  
  92. #define    skipblank(p)    { while (*(p) == ' ') (p)++; }
  93.  
  94. boot(cmd)
  95.     char *cmd;
  96. {
  97.     struct boottab **tablep;
  98.     register struct boottab *tp;
  99.     register struct bootparam *bp = *romp->v_bootparam;
  100.     register char *dev = 0, *name;
  101.     register char *p, *q;
  102.     char *gethex(), *puthex();
  103.     register int i,j;
  104.     int    eeprom_boot = 0;
  105.     struct saioreq req;
  106.  
  107.     if (*cmd == '?') 
  108.         goto syntax ;
  109.  
  110. /* for Sirius family we want to flush cache prior to a boot */
  111. #ifdef    SIRIUS
  112.     if (get_enable() & ENA_CACHE) {
  113.         vac_flush_all();
  114.     }
  115. #endif    SIRIUS
  116.  
  117.     for (p = cmd; *p != 0 && *p != ' ' && *p != '('; p++)
  118.         ;
  119.     q = p;
  120.     skipblank(p);
  121.     if (*p == '(') {    /* device specified */
  122.         p++;
  123.         if (q > cmd+2)
  124.             goto syntax;
  125.         *q = 0;
  126.         for (tablep = boottab; 0 != (tp = *tablep); tablep++) {
  127.             if (cmd[0] == tp->b_dev[0] && cmd[1] == tp->b_dev[1]) {
  128.                 dev = cmd;
  129.                 break;
  130.             }
  131.         }
  132.         if (dev == 0) goto syntax;
  133.         p = gethex(p, &bp->bp_ctlr);
  134.         p = gethex(p, &bp->bp_unit);
  135.         p = gethex(p, &bp->bp_part);
  136.         if (*p != 0 && *p != ')')
  137.             goto syntax;
  138.     } else {        /* default boot */
  139.         p = cmd;
  140.  
  141.         for (tablep = boottab; 0 != (tp = *tablep); tablep++) {
  142.              reset_alloc();
  143.            bzero((char *)&req, sizeof (req));
  144.            req.si_boottab = tp;
  145.  
  146.            if ((get_enable() & 0x01) == 1 && *p == 0) {
  147.               eeprom_boot = 1;
  148.               if (EEPROM->ee_diag.eed_diagdev[0] == tp->b_dev[0] &&
  149.                           EEPROM->ee_diag.eed_diagdev[1] == tp->b_dev[1]) {
  150.                   name = EEPROM->ee_diag.eed_diagpath; 
  151.                               bp->bp_ctlr = EEPROM->ee_diag.eed_diagctrl;
  152.                               dev = tp->b_dev;
  153.                               break;
  154.                       }
  155.            } else if (EEPROM->ee_diag.eed_defboot == EED_NODEFBOOT) {
  156.               if (EEPROM->ee_diag.eed_bootdev[0] == tp->b_dev[0] &&
  157.                   EEPROM->ee_diag.eed_bootdev[1] == tp->b_dev[1]) {
  158.                   bp->bp_ctlr = EEPROM->ee_diag.eed_bootctrl;
  159.                               dev = tp->b_dev;
  160.                               break;
  161.               }
  162.                    } else if ((bp->bp_ctlr = (*tp->b_probe)(&req)) != -1) {
  163.               dev = tp->b_dev;
  164.               break;
  165.            }
  166.         }
  167.  
  168.         if (eeprom_boot)
  169.            printf("\n\nEEPROM:  Diagnostic Auto-boot in progress...\n");
  170.  
  171.         if (dev == 0) {
  172.             printf("No default boot devices.\n\n");
  173.             return (-1);
  174.         }
  175.  
  176.         if (eeprom_boot) {
  177.             bp->bp_unit = EEPROM->ee_diag.eed_diagunit;
  178.                         bp->bp_part = EEPROM->ee_diag.eed_diagpart;
  179.         } else if (EEPROM->ee_diag.eed_defboot == EED_NODEFBOOT) {
  180.             bp->bp_unit = EEPROM->ee_diag.eed_bootunit;
  181.             bp->bp_part = EEPROM->ee_diag.eed_bootpart;
  182.         } else {
  183.             bp->bp_unit = 0;
  184.             bp->bp_part = 0;
  185.         }
  186.     }
  187.  
  188.     if (!eeprom_boot) {
  189.         if (*p == ')')
  190.             p++;
  191.         skipblank(p);
  192.         if (*p == 0 || *p == '-') {
  193.             name = "";    /* string for UNIX */
  194.         } else {
  195.             name = p;
  196.             while (*p != 0 && *p != ' ')
  197.             p++;
  198.             if (*p == ' ') {
  199.                 *p = 0;
  200.                 p++;
  201.                 skipblank(p);
  202.             }
  203.         }
  204.     }
  205.  
  206.     printf ("Boot: %c%c(%x,%x,%x)%s %s\n",
  207.         dev[0], dev[1], bp->bp_ctlr, bp->bp_unit, bp->bp_part, name, p);
  208.  
  209.     /* Put in bootparam */
  210.     bp->bp_dev[0] = dev[0];
  211.     bp->bp_dev[1] = dev[1];
  212.     bp->bp_boottab = tp;
  213.     q = bp->bp_strings;
  214.     *q++ = dev[0];
  215.     *q++ = dev[1];
  216.     *q++ = '(';
  217.     q = puthex(q, bp->bp_ctlr);
  218.     *q++ = ',';
  219.     q = puthex(q, bp->bp_unit);
  220.     *q++ = ',';
  221.     q = puthex(q, bp->bp_part);
  222.     *q++ = ')';
  223.     bp->bp_name = q;
  224.     while (*q++ = *name++)
  225.         ;
  226.     bp->bp_argv[0] = bp->bp_strings;
  227.     for (i = 1; i < (sizeof bp->bp_argv/sizeof bp->bp_argv[0])-1;) {
  228.         skipblank(p);
  229.         if (*p == '\0')
  230.             break;
  231.         bp->bp_argv[i++] = q;
  232.         while (*p != '\0' && *p != ' ')
  233.             *q++ = *p++;
  234.         /* SHOULD CHECK RANGE OF q */
  235.         *q++ = '\0';
  236.     }
  237.     bp->bp_argv[i] = (char *)0;
  238.     reset_alloc();    /* Set up to give resources to driver */
  239.     return ((*tp->b_boot)(bp));
  240.  
  241. syntax:
  242.     printf ("Boot syntax: b [!][dev(ctlr,unit,part)] name [options]\n\
  243. Possible boot devices:\n");
  244.     for (tablep = boottab; 0 != (tp = *tablep); tablep++)
  245.         printf("  %s\n", tp->b_desc);
  246.     return (-1);
  247. }
  248.  
  249. char *
  250. gethex(p, ip)
  251.     register char *p;
  252.     int *ip;
  253. {
  254.     register int acc = 0;
  255.  
  256.     skipblank(p);
  257.     while (*p) {
  258.         if (*p >= '0' && *p <= '9')
  259.             acc = (acc<<4) + (*p - '0');
  260.         else if (*p >= 'a' && *p <= 'f')
  261.             acc = (acc<<4) + (*p - 'a' + 10);
  262.         else if (*p >= 'A' && *p <= 'F')
  263.             acc = (acc<<4) + (*p - 'A' + 10);
  264.         else
  265.             break;
  266.         p++;
  267.     }
  268.     skipblank(p);
  269.     if (*p == ',')
  270.         p++;
  271.     skipblank(p);
  272.     *ip = acc;
  273.     return (p);
  274. }
  275.  
  276. char *
  277. puthex(p, n)
  278.     register char *p;
  279.     register int n;
  280. {
  281.     register int a;
  282.  
  283.     if (a = ((unsigned)n >> 4))
  284.         p = puthex(p, a);
  285.     *p++ = "0123456789abcdef"[n & 0xF];
  286.     return (p);
  287. }
  288.  
  289. nullsys()
  290. {
  291.     return (-1);
  292. }
  293.